/*
 * @Descripttion: 工具集
 * @version: 1.2
 * @LastEditors: sakuya
 * @LastEditTime: 2022年5月24日00:28:56
 */

import CryptoJS from 'crypto-js';
import sysConfig from "@/config";

const tool = {}

/* localStorage */
tool.data = {
	set(key, data, datetime = 0) {
		//加密
		if (sysConfig.LS_ENCRYPTION == "AES") {
			data = tool.crypto.AES.encrypt(JSON.stringify(data), sysConfig.LS_ENCRYPTION_key)
		}
		let cacheValue = {
			content: data,
			datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000
		}
		return localStorage.setItem(key, JSON.stringify(cacheValue))
	},
	get(key) {
		try {
			const value = JSON.parse(localStorage.getItem(key))
			if (value) {
				let nowTime = new Date().getTime()
				if (nowTime > value.datetime && value.datetime != 0) {
					localStorage.removeItem(key)
					return null;
				}
				//解密
				if (sysConfig.LS_ENCRYPTION == "AES") {
					value.content = JSON.parse(tool.crypto.AES.decrypt(value.content, sysConfig.LS_ENCRYPTION_key))
				}
				return value.content
			}
			return null
		} catch (err) {
			return null
		}
	},
	remove(key) {
		return localStorage.removeItem(key)
	},
	clear() {
		return localStorage.clear()
	}
}

// 处理m3u8链接权限
tool.handleM3u8Link = function (url) {
	const m3u8Url = url.split('?')[0];
	return m3u8Url;
}

// 时区
// console.log("*******************东区时间************************************");
// console.log("零时区-伦敦时间：" + getLocalTime(0));
// console.log("东一区-柏林时间：" + getLocalTime(1));
// console.log("东二区-雅典时间：" + getLocalTime(2));
// console.log("东三区-莫斯科时间：" + getLocalTime(3));
// console.log("东四区-时间：" + getLocalTime(4));
// console.log("东五区-伊斯兰堡时间：" + getLocalTime(5));
// console.log("东六区-科伦坡时间：" + getLocalTime(6));
// console.log("东七区-曼谷时间：" + getLocalTime(7));
// console.log("东八区-北京时间：" + getLocalTime(8));
// console.log("东九区-东京时间：" + getLocalTime(9));
// console.log("东十区-悉尼时间：" + getLocalTime(10));
// console.log("东十二区-斐济时间：" + getLocalTime(12));
// console.log("*******************西区时间************************************");
// console.log("西十区-斐济时间：" + getLocalTime(-10));
// console.log("西九区-阿拉斯加时间：" + getLocalTime(-9));
// console.log("西八区-太平洋时间（美国和加拿大）：" + getLocalTime(-8));
// console.log("西七区-山地时间（美国和加拿大）：" + getLocalTime(-7));
// console.log("西六区-中部时间（美国和加拿大）：" + getLocalTime(-6));
// console.log("西五区-东部时间（美国和加拿大）：" + getLocalTime(-5));
// console.log("西四区-大西洋时间（加拿大）：" + getLocalTime(-4));
// console.log("西三区-巴西利亚时间：" + getLocalTime(-3));
// i：时区；time：转换的时间；isUTC：是否转换utc格式
tool.getLocalTime = function (i,time = new Date(),isUTC = false) {
	if (typeof i !== 'number' && i > 12) return;

	var d = new Date(time); 
	//得到1970年一月一日到现在的秒数 
	var len = d.getTime();
	
	//本地时间与GMT时间的时间偏移差(注意：GMT这是UTC的民间名称。GMT=UTC）
	var offset = d.getTimezoneOffset() * 60000;

	//得到现在的格林尼治时间
	var utcTime = len + offset;
	var locationTime = new Date(utcTime + 3600000 * i);
	if(isUTC){
		locationTime = locationTime.toISOString();
	}
	return locationTime
}

// 
tool.formatDateTime = function (input, format = 'yyyy-MM-dd hh:mm:ss') {
    // 解析 ISO 8601 字符串（无时区部分）
    const [datePart, timePart] = input.split('T');
    const [year, month, day] = datePart.split('-').map(Number);
    const [hours, minutes, seconds] = timePart.split(':').map(Number);
    
    // 创建本地日期对象（避免 UTC 转换）
    const date = new Date(year, month - 1, day, hours, minutes, seconds);
    
    // 格式化工件
    const pad = (num) => num.toString().padStart(2, '0');
    const parts = {
        yyyy: date.getFullYear(),
        MM: pad(date.getMonth() + 1),
        dd: pad(date.getDate()),
        HH: pad(date.getHours()),      // 24小时制
        hh: pad(date.getHours() % 12 || 12), // 12小时制（00→12）
        mm: pad(date.getMinutes()),
        ss: pad(date.getSeconds())
    };
    
    // 替换格式占位符（支持 HH/hh 可选）
    return format.replace(
        /yyyy|MM|dd|HH|hh|mm|ss/g, 
        match => parts[match]
    );
}

/*sessionStorage*/
tool.session = {
	set(table, settings) {
		var _set = JSON.stringify(settings)
		return sessionStorage.setItem(table, _set);
	},
	get(table) {
		var data = sessionStorage.getItem(table);
		try {
			data = JSON.parse(data)
		} catch (err) {
			return null
		}
		return data;
	},
	remove(table) {
		return sessionStorage.removeItem(table);
	},
	clear() {
		return sessionStorage.clear();
	}
}

/*cookie*/
tool.cookie = {
	set(name, value, config = {}) {
		var cfg = {
			expires: null,
			path: null,
			domain: null,
			secure: false,
			httpOnly: false,
			...config
		}
		var cookieStr = `${name}=${escape(value)}`
		if (cfg.expires) {
			var exp = new Date()
			exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)
			cookieStr += `;expires=${exp.toGMTString()}`
		}
		if (cfg.path) {
			cookieStr += `;path=${cfg.path}`
		}
		if (cfg.domain) {
			cookieStr += `;domain=${cfg.domain}`
		}
		document.cookie = cookieStr
	},
	get(name) {
		var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"))
		if (arr != null) {
			return unescape(arr[2])
		} else {
			return null
		}
	},
	remove(name) {
		var exp = new Date()
		exp.setTime(exp.getTime() - 1)
		document.cookie = `${name}=;expires=${exp.toGMTString()}`
	}
}

/* Fullscreen */
tool.screen = function (element) {
	var isFull = !!(document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement);
	if (isFull) {
		if (document.exitFullscreen) {
			document.exitFullscreen();
		} else if (document.msExitFullscreen) {
			document.msExitFullscreen();
		} else if (document.mozCancelFullScreen) {
			document.mozCancelFullScreen();
		} else if (document.webkitExitFullscreen) {
			document.webkitExitFullscreen();
		}
	} else {
		if (element.requestFullscreen) {
			element.requestFullscreen();
		} else if (element.msRequestFullscreen) {
			element.msRequestFullscreen();
		} else if (element.mozRequestFullScreen) {
			element.mozRequestFullScreen();
		} else if (element.webkitRequestFullscreen) {
			element.webkitRequestFullscreen();
		}
	}
}

/* 复制对象 */
tool.objCopy = function (obj) {
	return JSON.parse(JSON.stringify(obj));
}

/* 日期格式化 */
tool.dateFormat = function (date, fmt = 'yyyy-MM-dd hh:mm:ss') {
	date = new Date(date)
	var o = {
		"M+": date.getMonth() + 1,                 //月份
		"d+": date.getDate(),                    //日
		"h+": date.getHours(),                   //小时
		"m+": date.getMinutes(),                 //分
		"s+": date.getSeconds(),                 //秒
		"q+": Math.floor((date.getMonth() + 3) / 3), //季度
		"S": date.getMilliseconds()             //毫秒
	};
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
	}
	for (var k in o) {
		if (new RegExp("(" + k + ")").test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
		}
	}
	return fmt;
}

/* 秒数转时分秒 ( 毫秒可选 ) */
tool.formateTime = function (time,isMillisecond = false) {
	const h = parseInt(time / 3600)
	const minute = parseInt(time / 60 % 60)
	const second = Math.floor(time % 60)
	const millSecond = parseInt(time%1*1000)

	const hours = h < 10 ? '0' + h : h
	const formatSecond = second > 59 ? 59 : second
	return `${hours > 0 ? `${hours}:` : '00:'}${minute < 10 ? '0' + minute : minute}:${formatSecond < 10 ? '0' + formatSecond : formatSecond}${isMillisecond? ':'+millSecond : ''}`
}

/* 
	时分秒转毫秒 
	isSecond: 是否转换为秒
*/
tool.turnMillSecond = function (time,isSecond = false) {
	let t = time.split(':');
	let mills = isSecond ? 1 : 1000
	let h = t[0] * 60 * 60 * mills;
	let minute = t[1] * 60 * mills;
	let second = t[2] * mills
	let millsecond = h + minute + second;
	return Number(millsecond);
}

/* 千分符 */
tool.groupSeparator = function (num) {
	num = num + '';
	if (!num.includes('.')) {
		num += '.'
	}
	return num.replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
		return $1 + ',';
	}).replace(/\.$/, '');
}
/**
 * 复制文本到剪贴板
 * @param {string} text 要复制的文本内容
 * @returns {Promise<void>} 复制成功时resolve，失败时reject
 */
tool.copyText = function (text) {
  // 空文本处理
  if (!text) {
    return Promise.reject(new Error('复制内容不能为空'));
  }

  return new Promise((resolve, reject) => {
    // 现代浏览器方案（优先使用）
    if (navigator.clipboard && navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text)
        .then(() => resolve())
        .catch(err => reject(new Error('复制失败: ' + err.message)));
    } 
    // 旧版浏览器降级方案
    else {
      try {
        // 创建临时文本域
        const textArea = document.createElement('textarea');
        textArea.value = text;
        textArea.style.position = 'fixed';  // 防止滚动
        textArea.style.opacity = '0';       // 透明隐藏
        
        // 添加到DOM
        document.body.appendChild(textArea);
        
        // 选中文本
        textArea.select();
        textArea.setSelectionRange(0, 99999); // 移动设备兼容
        
        // 执行复制命令
        const success = document.execCommand('copy');
        
        // 清理DOM
        document.body.removeChild(textArea);
        
        // 返回结果
        success ? resolve() : reject(new Error('复制命令执行失败'));
      } catch (err) {
        reject(new Error('复制操作异常: ' + err.message));
      }
    }
  });
}

/* 常用加解密 */
tool.crypto = {
	//MD5加密
	MD5(data) {
		return CryptoJS.MD5(data).toString()
	},
	//BASE64加解密
	BASE64: {
		encrypt(data) {
			return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
		},
		decrypt(cipher) {
			return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
		}
	},
	//AES加解密
	AES: {
		encrypt(data, secretKey, config = {}) {
			if (secretKey.length % 8 != 0) {
				console.warn("[SCUI error]: 秘钥长度需为8的倍数，否则解密将会失败。")
			}
			const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
				iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
				mode: CryptoJS.mode[config.mode || "ECB"],
				padding: CryptoJS.pad[config.padding || "Pkcs7"]
			})
			return result.toString()
		},
		decrypt(cipher, secretKey, config = {}) {
			const result = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(secretKey), {
				iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
				mode: CryptoJS.mode[config.mode || "ECB"],
				padding: CryptoJS.pad[config.padding || "Pkcs7"]
			})
			return CryptoJS.enc.Utf8.stringify(result);
		}
	}
}

export default tool
